/**
 * @file oled.h
 * @brief OLED驱动API
 * @author wangh (wanghuan3037@fiberhome.com)
 * @version 1.0
 * @date 2020-10-13
 * @copyright Copyright (c) 2020  烽火通信
 */
#ifndef __OLED_H
#define __OLED_H
#include "project_config.h"
#if DRV_OLED_EN
#include <stdbool.h>
#include "bsp_gpio.h"

#ifndef SSD1306
#define SSD1306         1
#endif

#ifndef SSD1309
#define SSD1309         2
#endif

#ifndef OLED_CHIP
#define OLED_CHIP       SSD1309
#endif

#ifndef OLED_USE_SPI
#define OLED_USE_SPI    0
#endif

#ifndef OLED_USE_CS
#define OLED_USE_CS     1
#endif

#ifndef OLED_USE_RES
#define OLED_USE_RES    1
#endif

#if OLED_USE_SPI
#include "bsp_spi.h"
#include "project_board.h"
#endif

/**
 * @brief UART参数校验位
 */
typedef enum
{
    OLED_CMD = 0,   ///< 写命令
    OLED_DATA = 1   ///< 写数据
}OledDC_t;

/**
 * @brief OLED对象结构体
 */
typedef struct Oled_s
{
#if OLED_USE_SPI
    Spi_t spi_obj;
#else
    Gpio_t Oled_scl;
    Gpio_t Oled_sda;
    Gpio_t Oled_dc;
#endif

#if OLED_USE_CS
    Gpio_t Oled_cs;
#endif

#if OLED_USE_RES
    Gpio_t Oled_res;
#endif

    bool IsInitialized;
} Oled_t;

/**
 * @brief OLED初始化
 * @param  obj         OLED对象
 * @param  scl         时钟线D0
 * @param  sda         数据线D1
 * @param  dc          数据/命令选择引脚
 * @param  cs          片选线
 * @param  res         复位线
 */
void OledInit( Oled_t *obj, PinNames scl, PinNames sda, PinNames dc, PinNames cs, PinNames res );

/**
 * @brief 开启OLED显示
 * @param  obj         OLED对象
 */
void OledDisplayOn( Oled_t *obj );

/**
 * @brief 关闭OLED显示
 * @param  obj         OLED对象
 */
void OledDisplayOff( Oled_t *obj );

/**
 * @brief OLED清屏
 * @param  obj         OLED对象
 */
void OledClear( Oled_t *obj );

/**
 * @brief OLED填充
 * @param  obj         OLED对象
 * @param  x1,y1,x2,y2 填充区域的对角坐标
 * @param  dot         0,清空;1,填充
 */
void OledFill( Oled_t *obj, uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t dot);

/**
 * @brief 在指定位置显示一个字符,包括部分字符
 * @param  obj         OLED对象
 * @param  x           x坐标
 * @param  y           y坐标
 * @param  chr         字符
 * @param  size        字体大小
 * @param  mode        0,反白显示;1,正常显示
 */
void OledShowChar( Oled_t *obj, uint8_t x, uint8_t y, uint8_t chr, uint8_t size, uint8_t mode);

/**
 * @brief 显示字符串
 * @param  obj         OLED对象
 * @param  x           x坐标
 * @param  y           y坐标
 * @param  p           字符串起始地址
 * @param  size        字体大小
 */
void OledShowString( Oled_t *obj, uint8_t x, uint8_t y, const uint8_t *p, uint8_t size);

/**
 * @brief 显示2个数字
 * @param  obj         OLED对象
 * @param  x           x坐标
 * @param  y           y坐标
 * @param  num         数值(0~4294967295)
 * @param  len         数字的位数
 * @param  size        字体大小
 */
void OledShowNum( Oled_t *obj, uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t size );

/**
 * @brief 更新显存到OLED
 * @param  obj         OLED对象
 */
void OledRefreshGram( Oled_t *obj );

#endif  /* DRV_OLED_EN */
#endif  // __OLED_H

/*********** (C) COPYRIGHT 2020 FiberHome *****END OF FILE****/
